﻿using System;
using System.Drawing;
using System.Windows.Forms;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using Engine;
using Library;
using MyControls;
using Gencode;
using Action=Library.Action;

namespace GameTool
{
    public partial class MeCung_Form1 : Form
    {
        #region Declare variables
        public MainForm mainForm;

        private int _currentComponent = -1;
        private int _currentGroup = 0;
        private int NumberOfColumn;
        private int NumberOfRow;
        private MatrixSubForm form2;
        private List<List<XeThoCom>> _components = null;
        public List<List<XeThoCom>> Components
        {
            set { _components = value; }
            get
            {
                if (_components == null)
                    _components = new List<List<XeThoCom>>();
                if (_components.Count == 0)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        _components.Add(new List<XeThoCom>());
                        AddGroup(i.ToString());
                    }
                }
                txtCounter.Text = _components[_currentGroup].Count.ToString();
                cmdDelete.Visible = (_components[_currentGroup].Count > 0);
                return _components;
            }
        }
        private bool _isClearTab = false;
        // LIEN QUAN DEN MATRIX
        private Button[] btn;
        private int _xxx = 0;
        #endregion

        #region Constructor
        public MeCung_Form1()
        {
            InitializeComponent();
            form2 = new MatrixSubForm(this);
        }
        #endregion

        #region User's Methods

        /// <summary>
        /// Add các tabpage (~ nhóm)
        /// </summary>
        /// <param name="groupName">Tên nhóm</param>
        private void AddGroup(string groupName)
        {
            try
            {
                TabPage tab = new TabPage();
                tab.Name = groupName;
                tab.Text = Common.Level[groupName];
                this.tabGroup.TabPages.Add(tab);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void LoadXMLDeBai(string url, string filename)
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();

                ftp_main.download(url, filename);
                xDoc.Load(filename);

                this.cmbLop.Text = MeCung_Form2.Instance.Lop;
                this.cmbVong.Text = MeCung_Form2.Instance.Vong;
                // Parser File Xml.
                XmlNodeList pointNode = xDoc.GetElementsByTagName("GiftPoint");

                XmlNodeList time = xDoc.GetElementsByTagName("TestTime");
                string timeString = time[0].InnerText;

                XmlNodeList MatrixRow = xDoc.GetElementsByTagName("Row");
                this.NumberOfRow = int.Parse(MatrixRow[0].InnerText);
                XmlNodeList MatrixCol = xDoc.GetElementsByTagName("Col");
                this.NumberOfColumn = int.Parse(MatrixCol[0].InnerText);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void LoadXMLMatrix(string url, string filename)
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();

                ftp_main.download(url, filename);
                xDoc.Load(filename);

                this.cmbLop1.Text = MeCung_Form2.Instance.Lop;
                this.cmbVong1.Text = MeCung_Form2.Instance.Vong;
                // Parser File Xml.
                XmlNodeList pointNode = xDoc.GetElementsByTagName("GiftPoint");
                string point = pointNode[0].InnerText;
                this.nUDDiem1.Value = Int32.Parse(point);

                XmlNodeList time = xDoc.GetElementsByTagName("TestTime");
                string timeString = time[0].InnerText;
                this.nUDThoiGian1.Value = Int32.Parse(timeString);

                XmlNodeList MatrixRow = xDoc.GetElementsByTagName("Row");
                this.NumberOfRow = int.Parse(MatrixRow[0].InnerText);
                this.nUDSoDong1.Value = this.NumberOfRow;
                XmlNodeList MatrixCol = xDoc.GetElementsByTagName("Col");
                this.NumberOfColumn = int.Parse(MatrixCol[0].InnerText);
                this.nUDSoCot1.Value = this.NumberOfColumn;

                XmlNodeList Matrix = xDoc.GetElementsByTagName("Value");
                string ValueMatrix = Matrix[0].InnerText;
                form2.UpdateMatrix(ValueMatrix);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void LoadXMLCauHoi(string url, string filename, string sublevel)
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();

                this.cmbLop.Text = MeCung_Form2.Instance.Lop;
                this.cmbVong.Text = MeCung_Form2.Instance.Vong;

                ftp_main.download(url, filename);
                xDoc.Load(filename);

                XmlNodeList questionList = xDoc.GetElementsByTagName("question");
                for (int i = 0; i < questionList.Count; i++)
                {
                    _xxx++;
                    XmlNode question = questionList[i];
                    XeThoCom xeThoCom = new XeThoCom();

                    string type = question.Attributes[0].Value;
                    xeThoCom.IsTuLuan = type;


                    XmlNodeList children = question.ChildNodes;
                    string strlevel = sublevel.Substring(3, 1);
                    int intlevel = int.Parse(strlevel) - 1;
                    xeThoCom.Level = intlevel.ToString();

                    string questionCode = children[0].InnerText;
                    string subjectString = children[1].InnerText;
                    xeThoCom.MainFileName = subjectString;
                    Bitmap image = new Bitmap(ftp_main.GetPicture(GetImagePath() + "\\" + cmbVong.Text + "\\" + sublevel, subjectString));
                    xeThoCom.Image = image;
                    xeThoCom.Modify = false;

                    XmlNode answerList = children[2];
                    XmlNodeList answer = answerList.ChildNodes;
                    for (int j = 0; j < answer.Count; j++)
                    {
                        ChildXeThoCom childXeThoCom = new ChildXeThoCom();
                        childXeThoCom.Modify = false;
                        string answerString = answer[j].InnerText;
                        string value = answer[j].Attributes[0].Value;

                        if (type == "1") // Tu luan
                        {
                            childXeThoCom.Value = answerString;
                            childXeThoCom.IsTrue = value;
                            childXeThoCom.IsTuLuan = true;
                        }
                        else
                        {
                            childXeThoCom.ChildFileName = answerString;
                            childXeThoCom.IsTrue = value;
                            Bitmap answerimage = new Bitmap(ftp_main.GetPicture(GetImagePath() + "\\" + cmbVong.Text + "\\" + sublevel, answerString));
                            childXeThoCom.Image = answerimage;
                            childXeThoCom.IsTuLuan = false;
                        }
                        xeThoCom.AppendCom(childXeThoCom);
                        xeThoCom.ShowCom();
                    }
                    AddCom(xeThoCom, intlevel, Components[intlevel].Count);
                    _currentComponent = (this.Components[_currentGroup].Count > 0) ? 0 : -1;
                }                
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private string UploadXMLDeBai()
        {
            string result = string.Empty;
            try
            {
                XmlDocument doc = new XmlDocument();
                XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc.AppendChild(docNode);

                XmlNode examinateNode = doc.CreateElement("Exminate");
                doc.AppendChild(examinateNode);

                XmlNode pointNode = doc.CreateElement("GiftPoint");
                pointNode.AppendChild(doc.CreateTextNode(this.nUDDiem1.Text.Trim()));
                examinateNode.AppendChild(pointNode);

                XmlNode timeNode = doc.CreateElement("TestTime");
                timeNode.AppendChild(doc.CreateTextNode(this.nUDThoiGian1.Text.Trim()));
                examinateNode.AppendChild(timeNode);

                XmlNode matrixsNode = doc.CreateElement("Matrixs");
                examinateNode.AppendChild(matrixsNode);

                // Tao ra mot ma tran moi
                XmlNode matrixNode = doc.CreateElement("Matrix");

                XmlAttribute attr = doc.CreateAttribute("type");
                attr.Value = "4";
                matrixNode.Attributes.Append(attr);

                XmlNode RowNode = doc.CreateElement("Row");
                RowNode.AppendChild(doc.CreateTextNode(this.nUDSoCot1.Value.ToString()));
                matrixNode.AppendChild(RowNode);

                XmlNode ColNode = doc.CreateElement("Col");
                ColNode.AppendChild(doc.CreateTextNode(this.nUDSoDong1.Value.ToString()));
                matrixNode.AppendChild(ColNode);

                // Tao ra file moi
                XmlNode ValueNode = doc.CreateElement("Value");
                string info = "";
                for (int i = 0; i < form2.Matrix.Length - 1; i++)
                {
                    info += form2.Matrix[i].ToString() + " ";
                }
                info += form2.Matrix[form2.Matrix.Length - 1].ToString();

                ValueNode.AppendChild(doc.CreateTextNode(info));
                matrixNode.AppendChild(ValueNode);

                matrixsNode.AppendChild(matrixNode);

                string xmlFile = "matrix.xml";
                doc.Save(xmlFile);
                UploadFile.UpFtpFile(GetXMLPath1(), cmbVong1.Text, xmlFile, xmlFile);
                System.IO.File.Delete(xmlFile);

                //INSERT();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return result;
        }

        private string UploadXMLCauHoi()
        {
            string result = string.Empty;
            try
            {
                XmlDocument doc0 = new XmlDocument();
                XmlDocument doc1 = new XmlDocument();
                XmlDocument doc2 = new XmlDocument();

                XmlNode docNode0 = doc0.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc0.AppendChild(docNode0);

                XmlNode QuestionsNode0 = doc0.CreateElement("questions");
                doc0.AppendChild(QuestionsNode0);

                XmlNode docNode1 = doc1.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc1.AppendChild(docNode1);

                XmlNode QuestionsNode1 = doc1.CreateElement("questions");
                doc1.AppendChild(QuestionsNode1);

                XmlNode docNode2 = doc2.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc2.AppendChild(docNode2);

                XmlNode QuestionsNode2 = doc2.CreateElement("questions");
                doc2.AppendChild(QuestionsNode2);

                // BEGIN Duyet danh sach component va add vao xml.
                for (int group = 0; group < this.Components.Count; group++)
                {
                    List<XeThoCom> thisCom = this.Components[group];
                    XmlDocument doc = null;
                    XmlNode QuestionsNode = null;
                    string MucFolder = "";
                    switch (group)
                    {
                        case 0:
                            doc = doc0;
                            QuestionsNode = QuestionsNode0;
                            MucFolder = "\\muc1";
                            break;
                        case 1:
                            doc = doc1;
                            QuestionsNode = QuestionsNode1;
                            MucFolder = "\\muc2";
                            break;
                        case 2:
                            doc = doc2;
                            QuestionsNode = QuestionsNode2;
                            MucFolder = "\\muc3";
                            break;
                    }
                    for (int i = 0; i < thisCom.Count; i++)
                    {
                        // Moi phan tu la mot question
                        XmlNode question = doc.CreateElement("question");

                        XmlAttribute type = doc.CreateAttribute("type");
                        type.Value = thisCom[i].IsTuLuan;
                        question.Attributes.Append(type);

                        XmlAttribute typeTest = doc.CreateAttribute("typeTest");
                        typeTest.Value = "4";
                        question.Attributes.Append(typeTest);

                        XmlNode codeNode = doc.CreateElement("code");
                        codeNode.AppendChild(doc.CreateTextNode(i.ToString()));
                        question.AppendChild(codeNode);

                        XmlNode subjectNode = doc.CreateElement("subject");

                        // Upload file anh - Question
                        thisCom[i].MyCapture(int.Parse(cmbLop.Text.Substring(3, cmbLop.Text.Length - 3)));
                        if (thisCom[i].Modify)
                        {
                            string pathName = thisCom[i].FullPath;
                            UploadFile.UpFtpFile(GetImagePath(), cmbVong.Text + MucFolder, thisCom[i].MainFileName,
                                                 pathName);
                        }
                        thisCom[i].ChangeStatusToLoad();

                        string mainFileName = thisCom[i].MainFileName;
                        subjectNode.AppendChild(doc.CreateTextNode(mainFileName));
                        question.AppendChild(subjectNode);

                        XmlNode answersNode = doc.CreateElement("answers");
                        // Duyet cac cau tra loi
                        foreach (ChildXeThoCom childXeThoCom in thisCom[i].Component)
                        {
                            XmlNode answerNode = doc.CreateElement("answer");
                            XmlAttribute Value = doc.CreateAttribute("value");

                            childXeThoCom.MyCapture(int.Parse(cmbLop.Text.Substring(3, cmbLop.Text.Length - 3)));
                            Value.Value = childXeThoCom.IsTrue;
                            answerNode.Attributes.Append(Value);
                            if (type.Value == "1")
                            {
                                answerNode.AppendChild(doc.CreateTextNode(childXeThoCom.Value));
                            }
                            else
                            {
                                answerNode.AppendChild(doc.CreateTextNode(childXeThoCom.ChildFileName));
                                // Upload 4 file anh - answers
                                if (childXeThoCom.Modify)
                                {
                                    string pathAnswer = childXeThoCom.FullPath;
                                    UploadFile.UpFtpFile(GetImagePath(), cmbVong.Text + MucFolder,
                                                         childXeThoCom.ChildFileName, pathAnswer);
                                }
                                childXeThoCom.ChangeStatusToLoad();
                            }
                            answersNode.AppendChild(answerNode);
                        }
                        question.AppendChild(answersNode);

                        QuestionsNode.AppendChild(question);
                    }
                }
                // END
                #region Upload xml
                string xmlFile = "question.xml";
                bool isUpload = true;//xác định xem có phải upload không. dùng chung cho 3 mức
                bool _exists = false;
                bool _isUpLoaded = false;//xác định xem đã upload lần nào chưa

                _exists = ftp_main.CheckExistsFile(GetXMLPath() + "\\" + cmbVong.Text);
                if (_exists)
                {
                    DialogResult _dialogResult = MessageBox.Show("Đã tồn tại dữ liệu vòng thi này. Bạn có chắc chắn muốn tải vòng này lên không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        isUpload = false;
                    }
                }
                if (isUpload)
                {
                    doc0.Save("muc1\\" + xmlFile);
                    UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text + "\\muc1", xmlFile, "muc1\\" + xmlFile);
                    System.IO.File.Delete("muc1\\" + xmlFile);

                    doc1.Save("muc2\\" + xmlFile);
                    UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text + "\\muc2", xmlFile, "muc2\\" + xmlFile);
                    System.IO.File.Delete("muc2\\" + xmlFile);

                    doc2.Save("muc3\\" + xmlFile);
                    UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text + "\\muc3", xmlFile, "muc3\\" + xmlFile);
                    System.IO.File.Delete("muc3\\" + xmlFile);

                    _isUpLoaded = true;
                }

                /*
                #region Mức 1
                _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong.Text + "\\muc1", "question.xml");
                if(_exists)
                {
                    DialogResult _dialogResult = MessageBox.Show("Đề bài mức 1 của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        isUpload = false;
                    }
                }
                if (isUpload)
                {
                    doc0.Save("muc1\\" + xmlFile);
                    UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text + "\\muc1", xmlFile, "muc1\\" + xmlFile);
                    System.IO.File.Delete("muc1\\" + xmlFile);
                    _isUpLoaded = true;
                }

                #endregion
                #region Mức 2
                isUpload = true;
                _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong.Text + "\\muc2", "question.xml");
                if (_exists)
                {
                    DialogResult _dialogResult = MessageBox.Show("Đề bài mức 2 của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        isUpload = false;
                    }
                }
                if (isUpload)
                {
                    doc1.Save("muc2\\" + xmlFile);
                    UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text + "\\muc2", xmlFile, "muc2\\" + xmlFile);
                    System.IO.File.Delete("muc2\\" + xmlFile);
                    _isUpLoaded = true;
                }
                #endregion
                #region Mức 3
                isUpload = true;
                _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong.Text + "\\muc3", "question.xml");
                if (_exists)
                {
                    DialogResult _dialogResult = MessageBox.Show("Đề bài mức 3 của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        isUpload = false;
                    }
                }
                if (isUpload)
                {
                    doc2.Save("muc3\\" + xmlFile);
                    UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text + "\\muc3", xmlFile, "muc3\\" + xmlFile);
                    System.IO.File.Delete("muc3\\" + xmlFile);
                    _isUpLoaded = true;
                }
                #endregion
                 * */
                if (_isUpLoaded)
                {
                    Common.LogAction(Action.Update);
                    MessageBox.Show("Tải đề lên server thành công!", "Thong bao", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }
                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return result;
        }

        /// <summary>
        /// Thêm component
        /// </summary>
        /// <param name="com">Component cần thêm</param>
        /// <param name="group">Nhóm cần thêm</param>
        /// <param name="index">Vị trí thêm</param>
        private void AddCom(XeThoCom com, int group, int index)
        {
            try
            {
                com.Visible = false;
                Components[group].Insert(index, com);
                this.pnlQuestion.Controls.Add(com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
                Application.Exit();
            }
        }

        /// <summary>
        /// Hiển thị component ở currentGroup currentComponent
        /// </summary>
        private void ShowCom()
        {
            try
            {
                if (_currentComponent < Components[_currentGroup].Count && -1 < _currentComponent)
                {
                    Components[_currentGroup][_currentComponent].Visible = true;
                    Components[_currentGroup][_currentComponent].STT = (_currentComponent + 1).ToString();
                    Components[_currentGroup][_currentComponent].Location = new Point(10 + cmdAddNormal.Size.Width, 8);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Ẩn component ở vị trí currentGroup currentComponent
        /// </summary>
        private void HideCom()
        {
            try
            {
                if (-1 < _currentComponent && _currentComponent < Components[_currentGroup].Count)
                    Components[_currentGroup][_currentComponent].Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Xóa XeThoCom ở currentGroup currentComponent
        /// </summary>
        private void DelCom()
        {
            try
            {
                List<XeThoCom> _list = this.Components[_currentGroup];
                if (-1 < _currentComponent && _currentComponent <= _list.Count - 1)
                {
                    this.pnlQuestion.Controls.Remove(_list[_currentComponent]);
                    _list.RemoveAt(_currentComponent);
                }

                if (_currentComponent > _list.Count - 1)
                    _currentComponent--;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Đổ dữ liệu vào các combobox
        /// </summary>
        private void InitData()
        {
            try
            {
                foreach (ClassInfo c in Common.ClassList)
                {
                    if (User.CheckPermission(c.Name))
                    {
                        cmbLop.Items.AddRange(new object[] { "lop" + c.Name });
                        cmbLop1.Items.AddRange(new object[] { "lop" + c.Name });
                    }
                }
                if (cmbLop.Items.Count > 0)
                {
                    cmbLop.SelectedIndex = 0;
                    cmbLop1.SelectedIndex = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Lấy vị trí cần lưu file xml trên server
        /// </summary>
        /// <returns></returns>
        private string GetXMLPath()
        {
            return Common.config.pathXml + "\\" + cmbLop.Text + "\\Game3";
        }

        /// <summary>
        /// Lấy vị trí cần lưu file xml mê cung trên server
        /// </summary>
        /// <returns></returns>
        private string GetXMLPath1()
        {
            return Common.config.pathXml + "\\" + cmbLop1.Text + "\\Game3";
        }

        /// <summary>
        /// Lấy vị trí lưu file ảnh trên server
        /// </summary>
        /// <returns></returns>
        private string GetImagePath()
        {
            return Common.config.pathImage + "\\" + cmbLop.Text + "\\Game3";
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu đầu vào trước khi lưu
        /// </summary>
        /// <returns>Thông điệp trả về: thông điệp trắng là hợp lệ</returns>
        private string ValidateInput()
        {
            string _mess = string.Empty;
            try
            {
                if (!chkViolympic.Checked && !chkViSchool.Checked && !chkViother.Checked)
                {
                    _mess = "Bạn chưa chọn nhập liệu cho chương trình nào.";
                    chkViolympic.Focus();
                    return _mess;
                }
                if (cmbLop.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn lớp.";
                    cmbLop.DroppedDown = true;
                    cmbLop.Focus();
                    return _mess;
                }
                if (cmbVong.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn Vòng.";
                    cmbVong.DroppedDown = true;
                    cmbVong.Focus();
                    return _mess;
                }

                #region Kiểm tra xem câu hỏi đã có câu trả lời chưa
                for (int i = 0; i < Components.Count; i++)
                {
                    int _idx = 0;
                    string _subMess = string.Empty;
                    foreach (XeThoCom xeThoCom in Components[i])
                    {
                        _idx++;
                        if (xeThoCom.Component.Count == 0)
                        {
                            if (_subMess.Length > 0)
                                _subMess += ", ";
                            _subMess += _idx.ToString();
                        }
                    }
                    if (_subMess.Length > 0)
                    {
                        _subMess = Common.Level[i.ToString()] + ": Phần tử: " + _subMess;
                        if (_mess.Length > 0)
                        {
                            _mess += "\n";
                        }
                        _mess += _subMess;
                    }
                }
                if (_mess.Length > 0)
                    _mess += "\nchưa có đáp án.";

                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }

            return _mess;
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu đầu vào trước khi lưu
        /// </summary>
        /// <returns>Thông điệp trả về: thông điệp trắng là hợp lệ</returns>
        private string ValidateMatrix()
        {
            string _mess = string.Empty;
            try
            {
                if (!chkViolympic1.Checked && !chkViSchool1.Checked && !chkViother1.Checked)
                {
                    _mess = "Bạn chưa chọn nhập liệu cho chương trình nào.";
                    chkViolympic1.Focus();
                    return _mess;
                }
                if (cmbLop1.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn lớp.";
                    cmbLop1.DroppedDown = true;
                    cmbLop1.Focus();
                    return _mess;
                }
                if (cmbVong1.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn Vòng.";
                    cmbVong1.DroppedDown = true;
                    cmbVong1.Focus();
                    return _mess;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }

            return _mess;
        }

        private void ViewMatrix()
        {
            try
            {
                MeCung_Form2.Instance.ShowDialog();
                string lop = MeCung_Form2.Instance.Lop;
                string vong = MeCung_Form2.Instance.Vong;
                ResetMatrix();
                String url = Common.config.pathXml + "\\" + lop + "\\Game3\\" + vong;

                if (lop.Length > 0 && vong.Length > 0)
                {
                    string fileDebai = "matrix.xml";
                    LoadXMLMatrix(url, fileDebai);
                    CreateMatrix(NumberOfRow, NumberOfColumn);
                    ShowMatrix();
                }
                
                MeCung_Form2.Instance.Vong = MeCung_Form2.Instance.Lop = string.Empty;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            MeCung_Form2.Instance.Vong = MeCung_Form2.Instance.Lop = string.Empty;
        }

        private void ViewCauHoi()
        {
            DialogResult _dialogResult =
                    MessageBox.Show(
                        "Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn xem câu hỏi?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (_dialogResult == System.Windows.Forms.DialogResult.No)
                return;
            try
            {
                MeCung_Form2.Instance.ShowDialog();
                string lop = MeCung_Form2.Instance.Lop;
                string vong = MeCung_Form2.Instance.Vong;

                String url = Common.config.pathXml + "\\" + lop + "\\Game3\\" + vong;

                if (lop.Length > 0 && vong.Length > 0)
                {
                    #region Reset
                    pnlQuestion.Visible = true;
                    for (int i = 0; i < Components.Count; i++)
                    {
                        _currentGroup = i;
                        List<XeThoCom> _list = this.Components[_currentGroup];
                        _currentComponent = (_list.Count > 0) ? 0 : -1;
                        while (_list.Count > 0)
                        {
                            DelCom();
                        }
                    }

                    Components.Clear();
                    this._isClearTab = true;
                    tabGroup.TabPages.Clear();
                    this._isClearTab = false;
                    _currentGroup = 0;
                    _currentComponent = -1;
                    #endregion

                    string fileDebai = "matrix.xml";
                    LoadXMLDeBai(url, fileDebai);

                    string fileCauHoi = "question.xml";
                    ArrayList fileList = ftp_main.list_dir(url);
                    {
                        if (fileList != null)
                        {
                            int i = 0;
                            foreach (string fileName in fileList)
                            {
                                if (fileName.Contains("muc"))
                                {
                                    LoadXMLCauHoi(url + "\\" + fileName, fileCauHoi, fileName);
                                    i++;
                                }
                            }
                        }
                    }
                }
                MeCung_Form2.Instance.Vong = MeCung_Form2.Instance.Lop = string.Empty;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void CreateMatrix(int Rows, int Columns)
        {
            try
            {
                int Total = Rows * Columns;
                btn = new Button[Total];
                int WidthSize = 50;
                int HeightSize = 50;
                int XStart = 100;
                int YStart = 150;

                int tempx = XStart;
                int tempy = YStart;
                for (int i = 0; i < Rows; i++)
                {
                    tempy = YStart + i * (HeightSize + 2);
                    for (int j = 0; j < Columns; j++)
                    {
                        btn[i * Columns + j] = new Button();
                        btn[i * Columns + j].BackColor = System.Drawing.SystemColors.Control;
                        tabMatrix.Controls.Add(btn[i * Columns + j]);
                        btn[i * Columns + j].Location = new System.Drawing.Point(tempx, tempy);
                        btn[i * Columns + j].Name = "txb" + i + "" + j;
                        btn[i * Columns + j].Size = new System.Drawing.Size(WidthSize, HeightSize);
                        btn[i * Columns + j].Visible = true;
                        btn[i * Columns + j].MouseClick += new MouseEventHandler(ClickButton);
                        tempx += WidthSize + 2;
                    }
                    tempx = XStart;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        public void ShowMatrix()
        {
            try
            {
                for (int i = 0; i < this.form2.Matrix.Length; i++)
                {
                    switch (this.form2.Matrix[i])
                    {
                        case -1:
                            // Tuong -1
                            InputDataToMatrix(1, i);
                            break;
                        case -2:
                            // Diem xuat phat -2
                            InputDataToMatrix(2, i);
                            break;
                        case -3:
                            // Diem ket thuc -3
                            InputDataToMatrix(3, i);
                            break;
                        case 0:
                            // Co cau hoi muc 3
                            InputDataToMatrix(7, i);
                            break;
                        case 1:
                            // Co cau hoi muc 1
                            InputDataToMatrix(4, i);
                            break;
                        case 2:
                            // Co cau hoi muc 2
                            InputDataToMatrix(5, i);
                            break;
                        case 3:
                            // Co cau hoi muc 3
                            InputDataToMatrix(6, i);
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        public void ResetMatrix()
        {
            try
            {
                if (this.btn != null)
                {
                    for (int i = 0; i < btn.Length; i++)
                    {
                        btn[i].Text = "";
                        btn[i].BackColor = Color.White;
                        btn[i].Visible = false;
                        //this.tabMatrix.Controls.Remove(btn[i]);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        public void InputDataToMatrix(int data, int index)
        {
            try
            {
                switch (data)
                {
                    case 1:
                        btn[index].BackColor = Color.Black;
                        break;
                    case 2:
                        btn[index].BackColor = Color.Wheat;
                        btn[index].Text = "Begin";
                        break;
                    case 3:
                        btn[index].BackColor = Color.Wheat;
                        btn[index].Text = "End";
                        break;
                    case 4:
                        btn[index].BackColor = Color.Yellow;
                        btn[index].Text = "M 1";
                        break;
                    case 5:
                        btn[index].BackColor = Color.Yellow;
                        btn[index].Text = "M 2";
                        break;
                    case 6:
                        btn[index].BackColor = Color.Yellow;
                        btn[index].Text = "M 3";
                        break;
                    case 7:
                        btn[index].BackColor = Color.White;
                        btn[index].Text = "";
                        break;
                }
                this.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void ClearMatrix()
        {
            try
            {
                if (btn != null)
                {
                    for (int i = 0; i < btn.Length; i++)
                    {
                        if (btn[i] != null)
                        {
                            this.Controls.Remove(btn[i]);
                            btn[i] = null;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private string CheckCreateMeCung()
        {
            string mess = string.Empty;
            try
            {
                if (this.cmbLop1.Text == "")
                {
                    mess = "Lớp chưa được chọn.";
                    cmbLop1.Focus();
                    return mess;
                }

                if (this.cmbVong1.Text == "")
                {
                    mess = "Vòng chưa được chọn.";
                    cmbVong1.Focus();
                    return mess;
                }
                if (this.nUDSoDong1.Value < 3)
                {
                    mess = "Số dòng ít nhất bằng 3.";
                    nUDSoDong1.Focus();
                    return mess;
                }
                if (this.nUDSoCot1.Value < 3)
                {
                    mess = "Số cột ít nhất bằng 3.";
                    nUDSoCot1.Focus();
                    return mess;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return mess;
        }

        /// <summary>
        /// Reset các control về giá trị ban đầu.
        /// </summary>
        private void Reset()
        {
            try
            {
                chkViother.Checked = chkViSchool.Checked = !(chkViolympic.Checked = true);
                if (cmbLop.Items.Count > 0)
                    cmbLop.SelectedIndex = 0;
                cmbVong.SelectedIndex = -1;
                pnlQuestion.Visible = true;
                for (int i = 0; i < Components.Count; i++)
                {
                    _currentGroup = i;
                    List<XeThoCom> list = Components[_currentGroup];
                    _currentComponent = (list.Count > 0) ? 0 : -1;
                    while (list.Count > 0)
                    {
                        DelCom();
                    }
                }
                _currentGroup = 0;
                _currentComponent = -1;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        #endregion

        #region Events
        private void btnReview_Click(object sender, EventArgs e)
        {
            ViewCauHoi();
            ShowCom();
        }

        private void cmdViewMatrix_Click(object sender, EventArgs e)
        {
            DialogResult _dialogResult =
                    MessageBox.Show("Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn tạo mới?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (_dialogResult == DialogResult.No)
                return;

            ViewMatrix();
        }

        private void btnNextQuest_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Components[_currentGroup].Count == 0)
                {
                    MessageBox.Show("Không có câu hỏi nào.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                if (_currentComponent == this.Components[_currentGroup].Count - 1)
                {
                    MessageBox.Show("Bạn đang xem câu hỏi cuối cùng.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    HideCom();
                    _currentComponent++;
                    ShowCom();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void btnPreQuest_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Components[_currentGroup].Count == 0)
                {
                    MessageBox.Show("Không có câu hỏi nào.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                if (_currentComponent == 0)
                {
                    MessageBox.Show("Bạn đang xem câu hỏi đầu tiên.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    HideCom();
                    _currentComponent--;
                    ShowCom();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmbLop_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cmbVong.Items.Clear();
                foreach (RoundInfo roundInfo in Common.RoundList[cmbLop.SelectedIndex])
                {
                    this.cmbVong.Items.AddRange(new object[] { "level" + roundInfo.RoundNumber });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmbLop1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cmbVong1.Items.Clear();
                foreach (RoundInfo roundInfo in Common.RoundList[cmbLop1.SelectedIndex])
                {
                    this.cmbVong1.Items.AddRange(new object[] { "level" + roundInfo.RoundNumber });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void MeCung_Form1_Load(object sender, EventArgs e)
        {
            InitData();
            pnlQuestion.Visible = false;
        }

        private void cmdAddNormal_Click(object sender, EventArgs e)
        {
            try
            {
                XeThoCom xeThoCom = new XeThoCom();
                xeThoCom.Level = tabGroup.SelectedIndex.ToString();
                if (-1 < _currentComponent && _currentComponent < Components[_currentGroup].Count)
                {
                    xeThoCom.IsTuLuan = Components[_currentGroup][_currentComponent].IsTuLuan;
                    HideCom();
                }

                AddCom(xeThoCom, _currentGroup, Components[_currentGroup].Count);
                _currentComponent = this.Components[_currentGroup].Count - 1;
                ShowCom();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdDelete_Click(object sender, EventArgs e)
        {
            DialogResult _dialogResult = MessageBox.Show("Xóa phần tử này?", "Xac nhan thao tac",
                                                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (_dialogResult == DialogResult.No)
            {
                return;
            }

            DelCom();
            ShowCom();
        }

        private void btnUploadDe_Click(object sender, EventArgs e)
        {
            try
            {
                #region Validate?
                string _mess = ValidateMatrix();
                if (_mess.Length > 0)
                {
                    _mess += "\nVui lòng kiểm tra lại!";
                    MessageBox.Show(_mess, "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (!form2.CheckValidate())
                {
                    MessageBox.Show("Mê cung bạn nhập vào chưa đúng, bạn vui lòng xem lại.");
                    return;
                }
                #endregion
                #region Exists?
                bool _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong1.Text, "matrix.xml");
                if (_exists)
                {
                    DialogResult _dialogResult = MessageBox.Show("Đề bài của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        return;
                    }
                }
                #endregion
                string result = this.UploadXMLDeBai();
                
                if (result.Length > 0)
                {
                    MessageBox.Show(result);
                }
                else
                {
                    MessageBox.Show("Tải đề lên server thành công!", "Thong bao", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void btnTaoDeMoi_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult =
                    MessageBox.Show("Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn tạo mới?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (_dialogResult == DialogResult.Yes)
                    Reset();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void ClickButton(object sender, MouseEventArgs e)
        {
            try
            {
                Button b = (Button)sender;
                NumberOfColumn = 9;
                NumberOfRow = 9;

                for (int i = 0; i < NumberOfColumn * NumberOfRow; i++)
                {
                    if (b.Name.CompareTo(btn[i].Name) == 0)
                    {
                        form2.ShowForm(i);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdTaoMeCung_Click(object sender, EventArgs e)
        {
            DialogResult _dialogResult =
                    MessageBox.Show("Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn tạo mới?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (_dialogResult == DialogResult.No)
                return;

            try
            {
                string mess = CheckCreateMeCung();
                if (mess.Length > 0)
                {
                    mess += "\nVui lòng kiểm tra lại!";
                    MessageBox.Show(mess, "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (ftp_main.CheckExistsFile(this.GetXMLPath() + "\\" + cmbVong1.Text))
                {
                    MessageBox.Show("Dữ liệu của vòng thi này đã tồn tại trên server. Bạn có muốn tạo dữ liệu mới không?");
                }

                ResetMatrix();
                this.NumberOfColumn = int.Parse(this.nUDSoCot1.Value.ToString());
                this.NumberOfRow = int.Parse(this.nUDSoDong1.Value.ToString());
                CreateMatrix(NumberOfRow, NumberOfColumn);

                form2.InitMatrix(NumberOfColumn * NumberOfRow);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdUploadCauHoi_Click(object sender, EventArgs e)
        {
            try
            {
                string _mess = ValidateInput();
                if (_mess.Length > 0)
                {
                    _mess += "\nVui lòng kiểm tra lại!";
                    MessageBox.Show(_mess, "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                UploadXMLCauHoi();
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        private void tabGroup_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                /*
             * Khi load đề lên thì phải xóa hết các nhóm của đề cũ
             * Để xóa các nhóm cũ thì phải xóa các tabpage
             * Xóa tabpage thì sự kiện này xảy ra và sinh lỗi
             * Checkk biến để biết khi xóa tabpage ta không xử lý gì cả
             */
                if (_isClearTab)
                    return;
                HideCom();
                _currentGroup = int.Parse(tabGroup.TabPages[tabGroup.SelectedIndex].Name);
                _currentComponent = (Components[_currentGroup].Count > 0) ? 0 : -1;
                ShowCom();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        #endregion

        #region Access to database
        private void INSERT()
        {
            GameQuestion insertDataBase = new GameQuestion();
            GameQuestionInfo gameInfo = new GameQuestionInfo();
            gameInfo.ClassID = ((ClassInfo)Common.ClassList[cmbLop1.SelectedIndex]).ID;
            gameInfo.CodeName = "Me Cung";
            gameInfo.Description = "Me Cung";
            gameInfo.GameID = 3;
            gameInfo.QuestionID = 1;
            gameInfo.SubjectID = 1;
            gameInfo.Round = ((RoundInfo)Common.RoundList[cmbLop1.SelectedIndex][cmbVong1.SelectedIndex]).RoundNumber;
            gameInfo.RoundID = ((RoundInfo)Common.RoundList[cmbLop1.SelectedIndex][cmbVong1.SelectedIndex]).ID;
            gameInfo.Type = 0;
            insertDataBase.Insert(gameInfo);
        }
        #endregion
    }
}